'use strict';

var gulp = require('gulp'),
    sass = require('gulp-sass'),                //替代css
    imagemin = require('gulp-imagemin'),       //图片压缩
    minifycss = require('gulp-minify-css'),    //css压缩
    jshint = require('jshint'),           //js检查
    uglify = require('gulp-uglify'),          //js压缩
    rename = require('gulp-rename'),           //重命名
    concat = require('gulp-concat'),          //合并文件
    clean = require('gulp-clean'),             //清空文件夹
    tinylr = require('tiny-lr'),               //livereload
    server = tinylr(),
    port = 8090,
    livereload = require('gulp-livereload'),   //livereload
    path = require('path'),
    filter = require('gulp-filter'),
    htmlmin = require('gulp-htmlmin');
//src 目录：
//基础js、css
var
    libSrc = ['./src/common/libs/pdf/pdf.worker.js'],/**/
//模块部分js、css
    modulecssSrc = ['./src/common/css/size.css', './src/common/css/reset.css', './src/common/css/app.css', './src/components/**/*.css'],
//html
    htmlsrc = ['./src/**/*.html'],
    ico = ['./src/*.ico'],
    pdf = ['./src/*.pdf'],
//图片目录
    imgsrc = ['./src/common/img/**'],

//dist编译目录生成对应合并压缩文件目录
    d_src = 'app/',
    d_js = d_src + 'common/js',
    d_css = d_src + 'common/css',
    d_libCss = d_src + 'common/libs/css',
    d_img = d_src + 'common/img',
    d_libs = d_src + 'common/libs',
    d_font = d_src + 'common/css/font';

// 默认任务 清空图片、样式、js并重建 运行语句 gulp
// base.js处理：angularjs

// app.js处理：app.js（启动入口）、router.js（路由配置）、以及components下的js
gulp.task('appScript', function () {
    console.log('========== 更新压缩appScript ==========');
    //生成对应压缩文件
    gulp.src(appjsSrc)
        .pipe(concat('app.js'))   //合并后的命名
        .pipe(gulp.dest(d_js)) //编译输出目录
        //.pipe(rename({suffix: '.min'})) //混入命名-重命名
        //.pipe(uglify())   //压缩
        //.pipe(gulp.dest(d_js)) //编译输出目录
        .pipe(livereload())
});

//sass编译
gulp.task('sass', function () {
    return gulp.src('src/**/*.scss')
        .pipe(sass().on('error', sass.logError))
        .pipe(gulp.dest('src'));
});

// appcss处理
gulp.task('appStyle', ['sass'], function () {
    console.log('========== 更新appStyle ==========');
    gulp.src(modulecssSrc)
        .pipe(concat('app.css'))
        //.pipe(minifycss())  //压缩
        .pipe(gulp.dest(d_css))
        .pipe(livereload());
});

// lib处理
gulp.task('libs', function () {
    console.log('========== 更新libs ==========');
    gulp.src(libSrc)
        .pipe(gulp.dest(d_libs))
        .pipe(livereload());
});


gulp.task('ico', function () {
    gulp.src(ico)
        .pipe(gulp.dest(d_src))
});

gulp.task('pdf', function () {
    gulp.src(pdf)
        .pipe(gulp.dest(d_src))
})
// HTML处理
gulp.task('pages', ['ico','pdf'], function () {
    console.log('========== 更新pages ==========');
    gulp.src(htmlsrc)
        .pipe(gulp.dest(d_src))
        .pipe(livereload());
});

// 图片处理
gulp.task('images', function () {
    console.log('========== 更新images ==========');
    gulp.src(imgsrc)
        //.pipe(imagemin())
        .pipe(gulp.dest(d_img))
        .pipe(livereload());
})

// 清空图片、样式、js
gulp.task('clean', function () {
    return gulp.src([d_src], {read: false})
        .pipe(clean());
});
//默认任务
gulp.task('default', ['clean'], function () {
    console.log('========== 重整目录 ==========');
    gulp.start('appScript', 'libs', 'appStyle', 'pages', 'images');
});

gulp.task('cleanButIMG', function () {//不删除img
    return gulp.src(['dist/components', 'dist/common/libs', 'dist/common/js', 'dist/common/css', 'dist/*.*',], {read: false})
        .pipe(clean());
});

gulp.task('allNoImg', ['cleanButIMG'], function () {
    console.log('========== 重整目录 ==========');
    gulp.start('appScript', 'libs', 'appStyle', 'pages');
});

gulp.task('watchNoImg', function () {
    //监听服务端口
    livereload.listen();
    // 监听app.js和模块js
    gulp.watch(['src/app.js', 'src/router.js', 'src/components/**/*.js', './src/common/**/*.js'], function () {
        gulp.start('appScript');
    });
    gulp.watch('src/bower_components/**/*.css', function () {
        gulp.start("baseStyle");
    });
    // 监听libs
    gulp.watch(['src/common/libs/**'], function () {
        gulp.start('libs');
    });
    // 监听css
    gulp.watch('src/**/*.html', function (event) {
        gulp.start('pages');
    });
    // 监听scss
    gulp.watch('src/**/*.scss', ['sass', 'appStyle']);
})

//监听所有文件目录 gulp watch
gulp.task('watch', function () {
    //监听服务端口
    livereload.listen();

    gulp.watch(['src/**', '!src/**/*.*'], function () {
        gulp.start('default');
    });
    // 监听app.js和模块js
    gulp.watch(['src/app.js', 'src/router.js', 'src/components/**/*.js', './src/common/**/*.js'], function () {
        gulp.start('appScript');
    });
    gulp.watch('src/bower_components/**/*.css', function () {
        gulp.start("baseStyle");
    });
    // 监听libs
    gulp.watch(['src/common/libs/**'], function () {
        gulp.start('libs');
    });
    // 监听css
    //gulp.watch('src/components/**/*.css', function () {
    //    gulp.start('appStyle');
    //});
    // 监听html
    gulp.watch('src/**/*.html', function (event) {
        gulp.start('pages');
    });
    // 监听img
    gulp.watch('src/common/img/**', function (event) {
        gulp.start('images');
    });
    // 监听scss
    gulp.watch('src/**/*.scss', ['sass', 'appStyle']);

});
/********************************上线压缩版本*/
var
    concatlibs = ['./src/common/libs/pdf/pdf.worker.js'],

    myFont = ['./src/common/libs/font/PingFangSC-Regular.ttf'],
//appjs和路由js
    uglifyJsSrc = [
        './src/common/libs/jquery.min.js',
        './src/common/libs/jquery.qqFace.js',
        './src/common/libs/angular.min.js',
        './src/common/libs/angular-ui-router.min.js',
        './src/common/libs/js/mobile-angular-ui.js',
        './src/common/libs/js/mobile-angular-ui.gestures.js',
        './src/common/libs/angular-cookie.min.js',
        './src/common/libs/placeholders.min.js',
        './src/common/libs/jquery.flot.js',
        './src/common/libs/resize.js',
        './src/common/libs/ui-bootstrap-tpls.js',
        './src/app.js',
        './src/router.js',
        './src/common/js/**/*.js',
        './src/components/**/*.js',
        './src/common/libs/webim/*.js',
        './src/common/libs/pdf/pdf.js'
    ],
    appjsSrc = ['./src/app.js', './src/router.js',
        './src/common/js/**/*.js', './src/components/**/*.js'],
    appCssSrc = [
        './src/common/libs/css/mobile-angular-ui-hover.css',
        './src/common/libs/css/mobile-angular-ui-base.css',
        './src/common/libs/css/mobile-angular-ui-desktop.css',
        './src/common/libs/font-awesome.css',
        './src/common/css/size.css',
        './src/common/css/style.css',
        './src/common/css/app.css',
        './src/components/**/*.css',
        './src/common/libs/1920.css',
    ];
// common样式处理
gulp.task('libs-JS', function () {
    console.log('========== 更新libs ==========');
    gulp.src(concatlibs)
        .pipe(gulp.dest(d_libs))
});

gulp.task('font-CSS', function () {
    console.log('========== 更新font ==========');
    gulp.src(myFont)
        .pipe(gulp.dest(d_font))
});

gulp.task('uglifyJSs', function () {
    console.log('========== 更新压缩appScript ==========');
    //生成对应压缩文件
    gulp.src(uglifyJsSrc)
        .pipe(concat('yjx.js'))   //合并后的命名
        //.pipe(gulp.dest(d_js)) //编译输出目录
        .pipe(rename({suffix: '.min'})) //混入命名-重命名
        .pipe(uglify())   //压缩
        .pipe(gulp.dest(d_js)) //编译输出目录
});

//appcss处理
gulp.task('appCSS', ['sass'], function () {
    console.log('========== 更新appStyle ==========');
    gulp.src(appCssSrc)
        .pipe(concat('app.css'))
        .pipe(minifycss())  //压缩
        .pipe(gulp.dest(d_css))
});

gulp.task('NOTuglifyJSs', function () {
    console.log('========== 更新压缩appScript ==========');
    //生成对应压缩文件
    gulp.src(uglifyJsSrc)
        .pipe(concat('yjx.js'))   //合并后的命名
        //.pipe(gulp.dest(d_js)) //编译输出目录
        .pipe(rename({suffix: '.min'})) //混入命名-重命名
        //.pipe(uglify())   //压缩
        .pipe(gulp.dest(d_js)) //编译输出目录
});

//appcss处理
gulp.task('NOTuglifyCSS', ['sass'], function () {
    console.log('========== 更新appStyle ==========');
    gulp.src(appCssSrc)
        .pipe(concat('app.css'))
        //.pipe(minifycss())  //压缩
        .pipe(gulp.dest(d_css))
});
//html压缩
/*1.collapseWhitespace:从字面意思应该可以看出来，清除空格，压缩html，这一条比较重要，作用比较大，引起的改变压缩量也特别大；
 2.collapseBooleanAttributes:省略布尔属性的值，比如：<input checked="checked"/>,那么设置这个属性后，就会变成 <input checked/>;
 3.removeComments:清除html中注释的部分，我们应该减少html页面中的注释。
 4.removeEmptyAttributes:清除所有的空属性，
 5.removeSciptTypeAttributes:清除所有script标签中的type="`/javascript"属性。
 6.removeStyleLinkTypeAttributes:清楚所有Link标签上的type属性。
 7.minifyJS:压缩html中的javascript代码。
 8.minifyCSS:压缩html中的css代码。*/
gulp.task('uglifyhtml', ['ico'], function () {
    var options = {
        collapseWhitespace: true,
        collapseBooleanAttributes: true,
        removeComments: true,
        removeEmptyAttributes: true,
        removeScriptTypeAttributes: true,
        removeStyleLinkTypeAttributes: true,
        minifyJS: true,
        minifyCSS: true
    };
    console.log('========== 压缩pages ==========');
    gulp.src(htmlsrc)
        .pipe(htmlmin(options))
        .on('error', function (e) {
            console.log(e)
        })
        .pipe(gulp.dest(d_src))
});

gulp.task('WATCH-NOTUglify', function () {
    //监听服务端口
    livereload.listen();
    // 监听img
    gulp.watch('src/common/img/**', function (event) {
        gulp.start('images');
    });

    gulp.watch(uglifyJsSrc, function () {
        gulp.start('NOTuglifyJSs');
    });

    //gulp.watch(appCssSrc, function () {
    //    gulp.start('NOTuglifyCSS');
    //});

    gulp.watch('src/**/*.html', function (event) {
        gulp.start('pages');
    });
    // 监听scss
    gulp.watch('src/**/*.scss', ['sass', 'appStyle', 'NOTuglifyCSS']);
});

//整合 压缩js css；
gulp.task('NOTUglify', ['clean'], function () {
    console.log('========== 重整目录 ==========');
    gulp.start('images', 'NOTuglifyJSs', 'NOTuglifyCSS', 'pages','libs-JS','font-CSS');
});

//整合；
gulp.task('#uglifyVersion', ['clean'], function () {
    console.log('========== 重整目录 ==========');
    gulp.start('libs','uglifyJSs', 'appCSS', 'images', 'pages','uglifyhtml');
});
